package com.qf.data.service.impl;

import com.qf.common.constant.CacheConstant;
import com.qf.common.model.DeviceModelValue;
import com.qf.data.service.DeviceModelValueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @author 千锋健哥
 */
@Service
@Slf4j
public class DeviceModelValueServiceImpl implements DeviceModelValueService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void saveDeviceModelValue(DeviceModelValue deviceModelValue) {
        if (deviceModelValue == null) {
            return;
        }

        //1. 判断设备key,  产品key不为空
        if (StringUtils.isEmpty(deviceModelValue.getDevice())
                || StringUtils.isEmpty(deviceModelValue.getProduct_key())) {
            log.info("上报数据的设备key和产品key都不可以为空!");
            return;
        }

        //2. 创建mongodb集合, device_value_产品key
        String collectionName = CacheConstant.Entity.DEVICE + CacheConstant.Suffix.VALUE + "_" + deviceModelValue.getProduct_key();

        //3. 给集合创建索引, 为了查询速度快
        deviceValueIndex(collectionName);

        //4. 保存文档到mongodb集合中
        mongoTemplate.insert(deviceModelValue, collectionName);


    }

    /**
     * 传感器上报的数据, 创建索引, 加快查询速度
     */
    private void deviceValueIndex(String collectionName) {
        //设备key索引
        Index deviceIndex = new Index();
        deviceIndex.background()
                //指定索引的字段, 和排序类型
                .on("device", Sort.Direction.DESC)
                //指定索引的名字
                .named("device_index");
        mongoTemplate.indexOps(collectionName).ensureIndex(deviceIndex);

        //产品key索引
        Index productIndex = new Index();
        productIndex.background()
                //指定索引的字段, 和排序类型
                .on("product_key", Sort.Direction.DESC)
                //指定索引的名字
                .named("product_key_index");
        mongoTemplate.indexOps(collectionName).ensureIndex(productIndex);

        //租户id索引
        Index tenantIdIndex = new Index();
        tenantIdIndex.background()
                //指定索引的字段, 和排序类型
                .on("tenant_id", Sort.Direction.DESC)
                //指定索引的名字
                .named("tenant_id_index");
        mongoTemplate.indexOps(collectionName).ensureIndex(tenantIdIndex);

        //创建时间索引
        Index createTimeIndex = new Index();
        createTimeIndex.background()
                //指定索引的字段, 和排序类型
                .on("createTime", Sort.Direction.DESC)
                //指定索引的名字
                .named("createTime_index");
        mongoTemplate.indexOps(collectionName).ensureIndex(createTimeIndex);
    }

}
